package com.wanghua.spring.test.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * SAX解析
 *
 * Element、Text类型节点对象都继承自 Node。
 */
public class SaxDemo {
    public static void main(String[] args) {  //D:\技术区\Java\Spring\Spring
        String userDir = System.getProperty("user.dir");
        File xmlFile = new File(userDir + "/src/com/wanghua/spring/test/xml/article.xml");
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            parser.parse(xmlFile, new MySaxHandler());  //解析文件，定义时的事件处理。
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * SAX解析XML文件是事件驱动的，类似于Swing中的时间监听器编写。在解析时需要创建一个监听器，这里通过继承 DefaultHandler 类。
 * 下面程序运行效果与 DomDemo 是一样的。
 */
class MySaxHandler extends DefaultHandler {
    static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private String content; //内容

    //接收元素中字符数据的通知。在执行完 startElement 或 endElement 方法后都会执行此操作。
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        content = new String(ch, start, length);
    }

    //接收元素开始的通知。当解析到元素的开始标签时触发。
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("article".equals(qName)) {
            System.out.println("\r\n找到一篇文章，所属分类：" + attributes.getValue("category") + ". ");
        }
    }

    //接收元素结束的通知。当解析到元素的结束标签时触发。
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("title".equals(qName))
            System.out.println("标题：" + content);
        else if ("author".equals(qName))
            System.out.println("作者：" + content);
        else if ("email".equals(qName))
            System.out.println("电子邮件：" + content);
        else if ("body".equals(qName))
            System.out.println("内容：" + content);
        else if ("date".equals(qName))
            System.out.println("发表日期：" + content);
    }
}
